package design.Test5decorator;

/**
 * 装饰模式（Decorator），动态地给一个对象添加一些额外的职责，就增加功能来说，
 * 装饰模式比生成子类更灵活
 *平常当系统需要新功能时，是向旧的类中添加新的代码，这些新加的代码通常装饰了原有类的核心职责
 * 或主要行为，这种做法的问题在于，它们再主类中加入了新的字段、新的方法和新的逻辑，
 * 从而增加了主类的复杂度，而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会
 * 执行的个特殊行为的需要。
 *
 * 而装饰模式却提供了一个非常好的解决方案，它把每个要装饰的功能放在单独的类中，
 * 并让这个类包装它所要装饰的对象。
 * 因此当需要执行特殊行为时，客户代码就可以在运行时根据需要有选择地、
 * 按顺序的地使用装饰功能包装对象了。
 * https://www.cnblogs.com/adamjwh/category/1215890.html
 * 优点，想增加类的功能时，增加装饰者，而且把类的核心功能和具体功能进行了划分。
 * 缺点，会造成过多的装饰者类
 *
 *
 */
public class Client {
    public static void main(String[] args) {
        //1
        Component water =new Water();
        System.out.println(water.cost());

        //2,开始装饰 sugar
        Component drink1 =new SugarDecorator(water);
        System.out.println(drink1.cost());

        //3,开始装饰 Tea
        Component drink2 =new TeaDecorator(drink1);
        System.out.println(drink2.cost());

    }

}
